"""
@program name : 三乐购物系统

@author : Jarvis_Clark

@time : 2021/07/17

实现功能
1.用户菜单分为登陆前的1级菜单和登陆后的2级菜单
2.所有可以让用户输入的地方都可以实现输入 exit(包括大写) 立刻退出程序，同时打印已购买商品和账户余额
(1级菜单功能)
3.能查看已有用户
2.能注册用户和设置密码，设置密码需要两次密码一致才会注册成功，注册失败可以重新注册
3.已注册用户通过输入正确的用户名和密码可以从1级菜单进入2级菜单，用户名或者密码错误会提醒存在错误，需要重新登录
（2级菜单功能）
4.能查看现有商品清单，有商品编号、商品名称和商品价格
5.能查看购物车得知当前的购买信息（购买了几份什么商品，总计多少）
6.能查看余额
7.能以非负整数的数值进行充值，会提醒不合法输入
8.通过输入商品编号和份数来购买商品，能提醒不合法输入。购买系统能实现多次购买，余额足够会直接扣款并添加购物记录，
当确认购买结束时，如果余额足够则提示购买成功，如果超过余额，会导致购买失败，清空本次的购物记录并返回扣款
9.本系统尽量考虑了交互的体验感，并且适当运用异色去标明一些重要信息，尽量设计了有趣、舒服的输出界面与输出语句
"""

#用户信息表函数:调用后输出现有用户
def user_print():
    print("\033[31m----------\033[0m")
    print("系统现有用户")
    for i in users_dict:
        print(f"\033[32m{i}\033[0m")
    print("\033[31m----------\033[0m")


#注册函数:调用开始注册用户
def regist():
    print("\033[31m注意:用户名和密码不允许为单独的 exit 单词\033[0m")
    user = input("请输入你要注册的用户名:")
    #exit退出出口
    if user.upper() == "EXIT":
        process_finished()
    while True:
        passwd = input("请设置你的密码:")
        #exit退出出口
        if passwd.upper() == "EXIT":
            process_finished()
        passwd1 = input("请确认你的密码:")
        #exit退出出口
        if passwd1.upper() == "EXIT":
            process_finished()
        if passwd != passwd1:
            print("\033[31m两次密码不一致！请重新设置密码\033[0m")
            continue
        else:
            break
    users_dict[user] = passwd
    print(f"注册成功！欢迎你,{user}")


#登录函数：成功就进入购物系统，错误则重新登录，可以任意输出 exit 退出
def login():
    #告知登录状态的变量
    global permission
    permission = 0

    admin = input("请输入你的用户名：")
    # exit退出出口
    if admin.upper() == "EXIT":
        process_finished()
    passwd = input("请输入你的密码：")
    # exit退出出口
    if passwd.upper() == "EXIT":
        process_finished()

    user = (admin,passwd)

    if user in users_dict.items():
        print(f"亲爱的{admin},您已登陆成功！")
        permission = 1

    else:
        print("\033[31m您的用户名或密码有误，请重新登录！\033[0m")


#商品信息查看函数：调用打印商品清单
def goods():
    print("================================")
    print("|         \033[31m三乐商品清单\033[0m           |")
    for i,j in goods_dict.items():
        print(f"| 编号{i}:\033[32m{j}\033[0m 价格:{price_dict[i]:>3} |")
    print("|___\"落俗不可避免  浪漫至死不渝\"___|")
    print("================================")


#购物车函数：进行购物车信息打印的操作
def cart():
    if cart_dict:
        global summation
        summation = 0

        print("您已购买：")
        for i,j in cart_dict.items():
            print(f"\033[32m{j}份{goods_dict[i]}\033[0m")
            summation += int(j)*price_dict[i]
        print(f"总计：\033[31m{summation}\033[0m")
    else:
        print("您没有购买任何商品，总计：\033[31m0\033[0m")


#购买函数：将用户购买的商品信息加入到购物车字典里，并提示购买成功
def purchase():
    global balance
    #因为每次购买都会进行余额计算,倘若多次购买最终购买失败,则用initial值把初始余额返回给balance
    initial_balance = balance

    while True:
        good = input("请输入你要购买的商品编号:")
        # exit退出出口
        if good.upper() == "EXIT":
            process_finished()
        #还没买就不想买了,就要干别的事
        if good.upper() == "Q":
            break
        copies = input("请输入你要购买的份数(\033[31m只需要输入阿拉伯数字，且为正整数\033[0m):")
        # exit退出出口
        if copies.upper() == "EXIT":
            process_finished()
        #还没买就不想买了,就要干别的事
        if copies.upper() == "Q":
            break
        if good not in goods_dict:
            print("\033[31m请输入正确的商品编号！\033[0m")
            continue
        elif not copies.isdigit():
            print("\033[31m请输入规范的份数！\033[0m")
            continue
        else:
            consumption = 0

            # 还没有重复购买同一个商品的情况
            if good not in cart_dict:
                cart_dict[good] = copies
                #以购物车里的商品编号作为遍历对象
                for a in cart_dict:
                    consumption += int(price_dict[a]) * int(cart_dict[a])
                if consumption > initial_balance:
                    print("购买失败！您的\033[31m余额不够\033[0m,请给账户充值。")
                    balance = initial_balance  # 购物失败，恢复初始余额
                    cart_dict.clear()  # 购买失败，清空本次购物记录
                    print(f"剩余余额:{balance}")
                    break  # 购买失败，退出购买系统
                else:
                    balance = initial_balance - consumption
                    print(f"剩余余额:{balance}")

                #判断是否继续购买
                swith = input("是否继续购买？输入 \033[31moff\033[0m 结束购买,输入 \033[31m其他任意键\033[0m 继续购买")
                # exit退出出口
                if swith.upper() == "EXIT":
                    process_finished()
                if swith.upper() == "OFF":
                    print("购买成功，本次购物结束")
                    print(f"剩余余额:{balance}")
                    break  # 购买成功，退出购买系统
                else:
                    continue

            #重复购买了同一个商品的情况
            if good in cart_dict:
                #字典的key天生去重,所以重新赋予新的value值
                cart_dict[good] = int(cart_dict[good]) + int(copies)
                # 以购物车里的商品编号作为遍历对象
                for a in cart_dict:
                    consumption += int(price_dict[a]) * int(cart_dict[a])
                if consumption > initial_balance:
                    print("购买失败！您的\033[31m余额不够\033[0m,请给账户充值。")
                    balance = initial_balance #购物失败，恢复初始余额
                    cart_dict.clear()  # 购买失败，清空本次购物记录
                    print(f"剩余余额:{balance}")
                    break  #购买失败，退出购买系统
                else:
                    balance = initial_balance - consumption
                    print(f"剩余余额:{balance}")

                #判断是否继续购买
                swith = input("是否继续购买？输入\033[31m off \033[0m结束购买,输入\033[31m 其他任意键 \033[0m继续购买")
                # exit退出出口
                if swith.upper() == "EXIT":
                    process_finished()
                if swith.upper() == "OFF":
                    print("购买成功，本次购物结束")
                    print(f"剩余余额:{balance}")
                    break #购买成功，退出购买系统
                else:
                    continue


#充值函数:调用可以给余额充值
def recharge():
    global balance
    recharge_value = input("请输入您要充值的金额:")
    # exit退出出口
    if recharge_value.upper() == "EXIT":
        process_finished()
    if recharge_value.isdigit():
        balance += int(recharge_value)
    elif not recharge_value.isdigit():
        print("\033[31m输入只能为阿拉伯数字且为非负整数\033[0m")


#退出函数:调用后打印已购买商品和余额,然后立刻结束程序
def process_finished():
    import os
    global balance
    print("您已退出三乐购物系统")
    if cart_dict:
        print("================================")
        print("|         \033[31m本次购物信息\033[0m           |")
        for i, j in cart_dict.items():
            print(f"|    \033[31m{j:>3}\033[0m 份 \033[32m{goods_dict[i]}\033[0m      |")
        print(f"|     您的余额为：  \033[31m{balance:>7}\033[0m      |")
        print("|___\"落俗不可避免  浪漫至死不渝\"___|")
        print("================================")
    else:
        print("================================")
        print("|         \033[31m本次购物信息\033[0m           |")
        print("|      \'您没有购买任何商品\'       |")
        print(f"|     您的余额为：  \033[31m{balance:>7}\033[0m      |")
        print("|___\"落俗不可避免  浪漫至死不渝\"___|")
        print("================================")
    os._exit(0)

#==============================================================
#用户字典
users_dict = {"NanFeng": "123456", "BeiHai": "654321"}
#商品字典和价格字典
goods_dict = {"01":"夏日系宽松五分袖","02":"畅轻燕麦黄桃酸奶","03":"留白小推车置物架","04":"酷炫风三轮轮滑鞋"}
price_dict = {"01":108,"02":68,"03":58,"04":488}
#购物车字典
cart_dict = {}
#余额
balance = 600
#告知登录状态的变量
permission = 0
#==============================================================
#用户菜单界面
#1级菜单选项按钮
while True:
    print("\033[32m三乐购物，您优质生活的必选项~\033[0m")
    print("\033[32m==================================================\033[0m")
    print("\033[31m外部操作栏\033[0m")
    print("\033[32m==================================================\033[0m")
    print("1.登录 2.注册 3.查看现有用户 9.退出程序")
    option_button_one = input("请输入您要执行的操作:")
    if option_button_one == "1":
        login()
        if permission == 1:
            break
    elif option_button_one == "2":
        regist()
    elif option_button_one == "3":
        user_print()
    elif option_button_one == "9":
        process_finished()
    elif option_button_one.upper() == "EXIT":
        process_finished()
    else:
        print("\033[31m请输入可选的选项数字！\033[0m")
        continue
#2级菜单选项按钮
while True:
    print("\033[32m三乐购物，您优质生活的必选项~\033[0m")
    print("\033[32m==================================================\033[0m")
    print("\033[31m内部操作栏\033[0m")
    print("\033[32m==================================================\033[0m")
    print("4.商品查看 5.购物 6.查看购物信息 7.充值 8.余查看额 9.退出程序")
    option_button_two = input("请输入您要执行的操作:")
    if option_button_two == "4":
        goods()
    elif option_button_two == "5":
        purchase()
    elif option_button_two == "6":
        cart()
    elif option_button_two == "7":
        recharge()
    elif option_button_two == "8":
        print(f"余额:{balance}")
    elif option_button_two == "9":
        process_finished()
    elif option_button_two.upper() == "EXIT":
        process_finished()
    else:
        print("\033[31m请输入可选的选项数字！\033[0m")
        continue
